package com.itheima.d3_abstract;
/*
    某宠物游戏，需要管理猫、狗的数据。
    猫的数据有：名字；行为是：喵喵喵的叫~
    狗的数据有：名字；行为是：汪汪汪的叫~
    请用面向对象编程设计该程序。

    抽象类的场景和好处 :
    结论 : 多个类中只要有重复代码（包括相同的方法签名），我们都应该抽取到父类中去
    此时，父类中就有可能存在只有方法签名的方法，这时，父类必定是一个抽象类了，我们抽出这样的抽象类，就是为了更好的支持多态。

 */
public class Test2 {
    public static void main(String[] args) {
        Dog dog = new Dog("小土狗");
        dog.cry();
        Cat cat = new Cat("汤姆");
        cat.cry();

        Animal dog1 = new Dog("小柴犬");
        dog1.cry();

        Animal cat1 = new Cat("胖胖");
        cat1.cry();
    }
}

abstract class Animal{
    private String name;

    abstract public void cry();

    public Animal() {
    }

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Cat extends Animal{

    @Override
    public void cry() {
        System.out.println(getName()+" 喵喵喵的叫");
    }

    public Cat(String name) {
        super(name);
    }
}

class Dog extends Animal{

    @Override
    public void cry() {
        System.out.println(getName()+" 汪汪汪的叫");
    }

    public Dog(String name) {
        super(name);
    }

    public Dog() {
    }
}
